package shiro;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.jdbc.JdbcRealm;
import org.apache.shiro.subject.Subject;

import java.util.ArrayList;
import java.util.List;

/**
 * 对shiro框架的基本学习使用第二阶段
 * 在上一次的基础上将用户的数据从配置文件转移到了数据库
 * 初始化shiro时使用JDBCRealm作为shiro的信息库
 */
public class MyShiroTestAddDB {
    // 创建JDBC数据源
    static DruidDataSource druidDataSource = new DruidDataSource();

    static {
        druidDataSource.setUrl("jdbc:mysql://192.168.3.201:3306/cuiyingjiedb");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("root");
    }

    public static void main(String[] args) {


        // 创建jdbcRealm数据源对象
        JdbcRealm jdbcRealm = new JdbcRealm();
        // 将druidDataSource绑定在jdbcRealm
        jdbcRealm.setDataSource(druidDataSource);
        // 设置开启可查询权限角色等SQL功能，一定要开启这个，不然查不到权限信息-坑1
        jdbcRealm.setPermissionsLookupEnabled(true);

        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
        defaultSecurityManager.setRealm(jdbcRealm);
        SecurityUtils.setSecurityManager(defaultSecurityManager);
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "123");
        subject.login(token);
        System.out.println(subject.getPrincipal() + "是否验证成功" + subject.isAuthenticated());

        // 使用ArrayList存储角色
        List<String> roles = new ArrayList<String>();
        roles.add("admin");
        roles.add("adminplus");
        roles.add("adminpro");
        // 循环测试角色
        for (String role : roles) {
            System.out.println("当前用户是" + subject.getPrincipal() + "\t 是否具有" + role + "角色 \t" + subject.hasRole(role));
        }

        // 使用arraylist存放权限组
        List<String> permissions = new ArrayList<String>();
        permissions.add("update");
        permissions.add("delete");
        permissions.add("add");
        permissions.add("get");
        // 循环验证当前用户是否具有对应的权限
        for (String permission : permissions) {
            System.out.println("当前用户是" + subject.getPrincipal() + "\t 是否具有" + permission + "权限 \t"
                    + subject.isPermitted(permission));
        }

        System.out.println(subject.isPermitted("get"));

        // 登出当前用户
        subject.logout();
        // 验证当前用户是否登出
        System.out.println(subject.getPrincipal() + "是否登录成功?" + subject.isAuthenticated());
    }
}
